﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using System.Drawing;
using System.Threading;
using System.Data;

namespace Control
{
    public interface IActie
    {
        void VoegArtikelToeAanDatabase(Artikel artikel);
        void VerwijderArtikelUitDatabase(int id);
        void VoegArtikelToeAanWinkel(Artikel artikel, int rek, int schap, int zijde);
        void VoegRekToeAanWinkel(Rek rek);
        void VerwijderSchap(int rek, int zijde, int schap);
        void VerwijderArtikelUitWinkel(int id, int rek, int schap, int zijde, Artikel artikel);
        void VerwijderRekUitWinkel(int rek);        
        void VeranderAlgoritme(TypeAlgoritme typeAlgoritme);
        void SlaAfbeeldingOp(Image img);
        void LaadAlleCategorieenUitDatabase();
        DataSet LaadNaamIdUitDatabase();
        List<string> LaadAlleWinkelsUitDatabase();
        void VoerAlgoritmeUit(List<string> categoriën, int snelheid, int tijd, double bedrag, double factor);
        void VoegPOIToe(POI punt);
        void StopAlgoritme();

        List<Artikel> LaadArtikelen(string categorie);
    }

    public class ConP1 : IActie
    {
        private Control control;
        private ConP2 conP2;
        private Thread thread;

        public ConP1()
        {
            control = Control.GetInstance();
            conP2 = new ConP2();
        }

        public void test() { }
        /// <summary>
        /// Voegt een artikel aan de database
        /// </summary>
        /// <param name="artikel">Het toe te voegen artikel</param>
        public void VoegArtikelToeAanDatabase(Artikel artikel)
        {
            thread = new Thread(() => control.VoegArtikelToeAanDatabase(artikel)) { IsBackground = true };
            thread.Start();
        }        

        /// <summary>
        /// Voegt een artikel toe aan de winkel
        /// </summary>
        /// <param name="artikel">Het toe te voegen artikel</param>
        /// <param name="rek">Het rek</param>
        /// <param name="schap">Het schap</param>
        /// <param name="zijde">De zijde</param>
        public void VoegArtikelToeAanWinkel(Artikel artikel, int rek, int schap, int zijde)
        {
            thread = new Thread(() => control.VoegArtikelToe(artikel, schap, zijde, rek)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Voegt een rek toe aan de winkel
        /// </summary>
        /// <param name="rek"></param>
        public void VoegRekToeAanWinkel(Rek rek)
        {
            thread = new Thread(() => conP2.VoegRekToe(rek)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Verwijder een schap
        /// </summary>
        /// <param name="rek">Het rek</param>
        /// <param name="zijde">De zijde</param>
        /// <param name="schap">Het schap</param>
        public void VerwijderSchap(int rek, int zijde, int schap)
        {
            thread = new Thread(() => conP2.VerwijderSchap(rek, zijde, schap)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Verwijdert artikel uit database
        /// </summary>
        /// <param name="productID">De id</param>
        public void VerwijderArtikelUitWinkel(int id, int rek, int schap, int zijde, Artikel artikel)
        {
            thread = new Thread(() => control.VerwijderArtikelUitWinkel(id, rek, schap, zijde, artikel)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Verwijdert een rek uit de winkel
        /// </summary>
        /// <param name="rek"></param>
        public void VerwijderRekUitWinkel(int rek)
        {
            thread = new Thread(() => conP2.VerwijderRek(rek)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Bereken de route die de gebruiker moet gaan bewandelen.
        /// </summary>
        /// <param name="winkel">Een plattegrond met de locatie van rekken en producten</param>
        /// <param name="categoriën">De categoriën die de gebruiker mee wilt laten spelen in de route</param>
        /// <param name="snelheid">De snelheid in m/s</param>
        /// <param name="tijd">De tijd in seconde</param>
        /// <param name="bedrag">Het bedrag in euro's</param>
        public void VoerAlgoritmeUit(List<string> categoriën, int snelheid, int tijd, double bedrag, double factor)
        {
            thread = new Thread(() => conP2.AlgoritmeUitvoeren(categoriën, snelheid, tijd, bedrag, factor)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Verander het algoritme naar een ander type (bijv. van tijd naar bedrag)
        /// Gebruik hier de enum TypeAlgoritme voor.
        /// </summary>
        /// <param name="typeAlgoritme">Het type algoritme</param>
        public void VeranderAlgoritme(TypeAlgoritme typeAlgoritme)
        {
            thread = new Thread(() => conP2.VeranderAlgoritme(typeAlgoritme)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Laad alle categorieën uit de database in een apparte thread
        /// </summary>
        public void LaadAlleCategorieenUitDatabase()
        {
            thread = new Thread(control.LaadAlleCategorieenUitDatabase) {IsBackground = true};
            thread.Start();
        }

        /// <summary>
        /// Laad een naam uit de database
        /// </summary>
        /// <returns>Ddataset wordt terug gegeven</returns>
        public DataSet LaadNaamIdUitDatabase()
        {
            return control.LaadAlleNamenUitDatabase();           
        }

        /// <summary>
        /// Slaat afbeelding op in klasse winkel
        /// </summary>
        /// <param name="img"></param>
        public void SlaAfbeeldingOp(Image img)
        {
            thread = new Thread(() => conP2.SlaAfbeeldingOp(img)) { IsBackground = true };
            thread.Start();
        }

        /// <summary>
        /// Verwijdert artikel uit de database
        /// </summary>
        /// <param name="id">De id van het te verwijderen artikel</param>
        public void VerwijderArtikelUitDatabase(int id)
        {
            thread = new Thread(() => control.VerwijderArtikelUitDatabase(id)) {IsBackground = true};
            thread.Start();
        }

        /// <summary>
        /// Laad alle winkels uit de database
        /// </summary>
        /// <returns>Lijst van winkels</returns>
        public List<string> LaadAlleWinkelsUitDatabase()
        {
           return control.LaadAlleWinkelsUitDatabase();
        }


        #region IActie Members


        public void VoegPOIToe(POI punt)
        {
            control.VoegPOIToe(punt);
        }

        public void StopAlgoritme()
        {
            Thread paralel = new Thread(conP2.StopAlgoritme);
            paralel.Start();
        }

        #endregion

        #region IActie Members


        public List<Artikel> LaadArtikelen(string categorie)
        {
            return control.LaadArtikelen(categorie);
        }

        #endregion
    }
}
